package com.smartfast4j.backend.common.filter;

import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * CROS过滤器
 *使用CROS解决跨域问题
 *CORS是一个W3C标准，全称是"跨域资源共享"（Cross-origin resource sharing）。
 *它允许浏览器向跨源服务器，发出XMLHttpRequest请求，从而克服了AJAX只能同源使用的限制。
 *基本上目前所有的浏览器都实现了CORS标准,其实目前几乎所有的浏览器ajax请求都是基于CORS机制的
 */
//@WebFilter(filterName = "CorsFilter",urlPatterns = "/*")
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        logger.info("进入CorsFilter");
        String url = request.getHeader("Origin");
        logger.debug("Access-Control-Allow-Origin:" + url);
        /**
         * 这个字段是必须的。值为代表着允许任何域访问
         * 需要注意的是，如果要发送Cookie，Access-Control-Allow-Origin就不能设为星号，必须指定明确的、与请求网页一致的域名。
         */
        response.addHeader("Access-Control-Allow-Origin", "*");
        //response.addHeader("Access-Control-Allow-Origin", url);
        /**
         * 该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。默认情况下，
         Cookie不包括在CORS请求之中。设为true，即表示服务器明确许可，Cookie可以
         包含在请求中，一起发给服务器。这个值也只能设为true，如果服务器不要浏
         览器发送Cookie，删除该字段即可。
         */
        //response.addHeader("Access-Control-Allow-Credentials", "true");
        //支持的http 动作，这个字段是必须的。值为请求类型名
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        //响应头
        response.addHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");
        filterChain.doFilter(request, response);
    }
}